{
GtkTreeViewColumn *column;
GtkWidget *button;
- GdkWindow *window;
for (list = tree_view->priv->columns; list; list = list->next)
{
!gtk_widget_get_mapped (button))
gtk_widget_map (button);
}
- for (list = tree_view->priv->columns; list; list = list->next)
- {
- column = list->data;
- if (gtk_tree_view_column_get_visible (column) == FALSE)
- continue;
-
- window = _gtk_tree_view_column_get_window (column);
- if (gtk_tree_view_column_get_resizable (column))
- {
- gdk_window_raise (window);
- gdk_window_show (window);
- }
- else
- gdk_window_hide (window);
- }
}
}
{
GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
GtkTreeViewPrivate *priv = tree_view->priv;
- GList *list;
if (priv->scroll_timeout != 0)
{
g_source_remove (priv->typeselect_flush_timeout);
priv->typeselect_flush_timeout = 0;
}
-
- for (list = priv->columns; list; list = list->next)
- _gtk_tree_view_column_unrealize_button (GTK_TREE_VIEW_COLUMN (list->data));
if (priv->drag_window)
{
gdouble y,
GtkTreeView *tree_view)
{
- GdkEventSequence *sequence;
GtkTreeViewColumn *column;
- const GdkEvent *event;
GList *list;
- gint i;
if (n_press != 2)
return;
- sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
- event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
-
- for (i = 0, list = tree_view->priv->columns; list; list = list->next, i++)
+ for (list = tree_view->priv->columns; list; list = list->next)
{
column = list->data;
- if (event->any.window != _gtk_tree_view_column_get_window (column) ||
- !gtk_tree_view_column_get_resizable (column))
+ if (!_gtk_tree_view_column_coords_in_resize_rect (column, x, y) ||
+ !gtk_tree_view_column_get_resizable (column))
continue;
if (gtk_tree_view_column_get_sizing (column) != GTK_TREE_VIEW_COLUMN_AUTOSIZE)
gdouble start_y,
GtkTreeView *tree_view)
{
- GdkEventSequence *sequence;
GtkTreeViewColumn *column;
- const GdkEvent *event;
- GdkWindow *window;
gboolean rtl;
GList *list;
gint i;
rtl = (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL);
- sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
- event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
- window = event->any.window;
for (i = 0, list = tree_view->priv->columns; list; list = list->next, i++)
{
column = list->data;
- if (window != _gtk_tree_view_column_get_window (column))
+ if (!_gtk_tree_view_column_coords_in_resize_rect (column, start_x, start_y))
continue;
if (!gtk_tree_view_column_get_resizable (column))
gtk_widget_set_parent (button, GTK_WIDGET (tree_view));
g_object_unref (button);
gtk_widget_queue_resize (widget);
- if (gtk_tree_view_column_get_resizable (tree_view->priv->drag_column))
- {
- gdk_window_raise (_gtk_tree_view_column_get_window (tree_view->priv->drag_column));
- gdk_window_show (_gtk_tree_view_column_get_window (tree_view->priv->drag_column));
- }
- else
- gdk_window_hide (_gtk_tree_view_column_get_window (tree_view->priv->drag_column));
gtk_widget_grab_focus (button);
GtkRBTree *tree;
GtkRBNode *node;
gint new_y;
+ GList *list;
+ gboolean cursor_set = FALSE;
tree_view = (GtkTreeView *) widget;
prelight_or_select (tree_view, tree, node, event->x, event->y);
}
+ for (list = tree_view->priv->columns; list; list = list->next)
+ {
+ GtkTreeViewColumn *column = list->data;
+
+ if (_gtk_tree_view_column_coords_in_resize_rect (column, event->x, event->y))
+ {
+ GdkDisplay *display = gtk_widget_get_display (widget);
+ GdkCursor *cursor = gdk_cursor_new_from_name (display, "col-resize");
+
+ gtk_widget_set_cursor (widget, cursor);
+ g_object_unref (cursor);
+ cursor_set = TRUE;
+ break;
+ }
+ }
+
+ if (!cursor_set)
+ gtk_widget_set_cursor (widget, NULL);
+
return GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->motion_notify_event (widget, event);
}
position = g_list_index (tree_view->priv->columns, column);
- if (gtk_widget_get_realized (GTK_WIDGET (tree_view)))
- _gtk_tree_view_column_unrealize_button (column);
-
_gtk_tree_view_column_unset_tree_view (column);
tree_view->priv->columns = g_list_remove (tree_view->priv->columns, column);
#include "gtkintl.h"
#include "gtktypebuiltins.h"
#include "a11y/gtktreeviewaccessibleprivate.h"
+#include "gtkwidgetprivate.h"
/**
GtkWidget *child;
GtkWidget *arrow;
GtkWidget *frame;
- GdkWindow *window;
gulong property_changed_signal;
gfloat xalign;
priv->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), GTK_SHADOW_NONE);
+ gtk_widget_set_hexpand (priv->frame, TRUE);
gtk_widget_set_halign (priv->frame, GTK_ALIGN_START);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
gtk_tree_view_get_headers_visible (GTK_TREE_VIEW (priv->tree_view)))
{
gtk_widget_show (priv->button);
-
- if (priv->window)
- {
- if (priv->resizable)
- {
- gdk_window_show (priv->window);
- gdk_window_raise (priv->window);
- }
- else
- {
- gdk_window_hide (priv->window);
- }
- }
}
else
{
gtk_widget_hide (priv->button);
- if (priv->window)
- gdk_window_hide (priv->window);
}
}
_gtk_tree_view_column_realize_button (GtkTreeViewColumn *column)
{
GtkTreeViewColumnPrivate *priv = column->priv;
- GtkAllocation allocation;
- GtkTreeView *tree_view;
- gboolean rtl;
- GdkDisplay *display;
- GdkCursor *cursor;
- tree_view = (GtkTreeView *)priv->tree_view;
- rtl = (gtk_widget_get_direction (priv->tree_view) == GTK_TEXT_DIR_RTL);
-
- g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
+ g_return_if_fail (GTK_IS_TREE_VIEW (priv->tree_view));
g_return_if_fail (gtk_widget_get_realized (priv->tree_view));
g_return_if_fail (priv->button != NULL);
- gtk_widget_set_parent_window (priv->button, gtk_widget_get_window (priv->tree_view));
-
- display = gtk_widget_get_display (priv->tree_view);
- gtk_widget_get_allocation (priv->button, &allocation);
-
- priv->window = gdk_window_new_input (gtk_widget_get_window (priv->tree_view),
- GDK_ALL_EVENTS_MASK,
- &(GdkRectangle) {(allocation.x + (rtl ? 0 : allocation.width)) - TREE_VIEW_DRAG_WIDTH / 2, 0,
- TREE_VIEW_DRAG_WIDTH, _gtk_tree_view_get_header_height (tree_view)});
- cursor = gdk_cursor_new_from_name (display, "col-resize");
- gdk_window_set_cursor (priv->window, cursor);
- g_object_unref (cursor);
-
- gtk_widget_register_window (GTK_WIDGET (tree_view), priv->window);
-
gtk_tree_view_column_update_button (column);
}
-void
-_gtk_tree_view_column_unrealize_button (GtkTreeViewColumn *column)
-{
- GtkTreeViewColumnPrivate *priv;
-
- g_return_if_fail (column != NULL);
-
- priv = column->priv;
- g_return_if_fail (priv->window != NULL);
-
- gtk_widget_unregister_window (GTK_WIDGET (priv->tree_view), priv->window);
- gdk_window_destroy (priv->window);
- priv->window = NULL;
-}
-
void
_gtk_tree_view_column_unset_model (GtkTreeViewColumn *column,
GtkTreeModel *old_model)
int width)
{
GtkTreeViewColumnPrivate *priv;
- gboolean rtl;
GtkAllocation allocation = { 0, 0, 0, 0 };
- GtkAllocation widget_allocation;
GtkAllocation clip;
g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
priv->width = width;
gtk_cell_area_context_allocate (priv->cell_area_context, priv->width - priv->padding, -1);
- gtk_widget_get_allocation (priv->tree_view, &widget_allocation);
if (gtk_tree_view_get_headers_visible (GTK_TREE_VIEW (priv->tree_view)))
{
- allocation.x = widget_allocation.x + x_offset;
- allocation.y = widget_allocation.y;
+ /* TODO: Underallocates the button horizontally, but
+ * https://bugzilla.gnome.org/show_bug.cgi?id=770388
+ */
+ allocation.x = x_offset;
+ allocation.y = 0;
allocation.width = width;
allocation.height = _gtk_tree_view_get_header_height (GTK_TREE_VIEW (priv->tree_view));
gtk_widget_size_allocate (priv->button, &allocation, -1, &clip);
}
- if (priv->window)
- {
- rtl = (gtk_widget_get_direction (priv->tree_view) == GTK_TEXT_DIR_RTL);
- gdk_window_move_resize (priv->window,
- allocation.x + (rtl ? 0 : allocation.width) - TREE_VIEW_DRAG_WIDTH/2,
- allocation.y,
- TREE_VIEW_DRAG_WIDTH, allocation.height);
- }
-
g_object_notify_by_pspec (G_OBJECT (tree_column), tree_column_props[PROP_X_OFFSET]);
g_object_notify_by_pspec (G_OBJECT (tree_column), tree_column_props[PROP_WIDTH]);
}
return tree_column->priv->button;
}
-GdkWindow *
-_gtk_tree_view_column_get_window (GtkTreeViewColumn *column)
-{
- return column->priv->window;
-}
-
void
_gtk_tree_view_column_push_padding (GtkTreeViewColumn *column,
gint padding)
{
return column->priv->cell_area_context;
}
+
+gboolean
+_gtk_tree_view_column_coords_in_resize_rect (GtkTreeViewColumn *column,
+ double x,
+ double y)
+{
+ GtkTreeViewColumnPrivate *priv = column->priv;
+ GtkAllocation button_allocation;
+
+ /* x and y are in treeview coordinates. */
+
+ if (!gtk_widget_get_realized (priv->button) ||
+ !priv->resizable ||
+ !priv->visible)
+ return FALSE;
+
+ gtk_widget_get_outer_allocation (priv->button, &button_allocation);
+
+ /* No translation needed */
+ g_assert (gtk_widget_get_parent (priv->button) == priv->tree_view);
+
+ if (gtk_widget_get_direction (priv->tree_view) == GTK_TEXT_DIR_LTR)
+ button_allocation.x += button_allocation.width - TREE_VIEW_DRAG_WIDTH;
+
+ button_allocation.width = TREE_VIEW_DRAG_WIDTH;
+ return gdk_rectangle_contains_point (&button_allocation, (int)x, (int)y);
+}